package com.ssm.dao;

import com.ssm.entity.User;

/**
 * Mybatis工作原理：
 * @author Administrator
 * 1）Mybatis的ORM映射文件与Hibernate的不同，MybatisORM映射是指实体类与查询结果集相映射，而Hibernate的ORM映射
 * 是指实体类与表结构（视图结构）相映射。
 * 2）通过输入流读取主配置文件，主配置文件中引入ORM映射文件
 * 3）创建一个SqlSessionFactory对象，利用它的openSession方法，返回一个SqlSession对象
 * 4）SqlSession对象的五个常用方法：selectOne、selectList、insert、delete、update
 * 	这五个方法第一个参数都是字符串（ORM映射文件的namespace属性值加一个.,再加要执行的insert、delete、update、select
 * 四种标签的id属性值，格式如：com.ssm.dao.UserMapper.loadUserByUserName），这四种标签都可以写parameterType、
 * parameterMap属性，parameterType是指参数类型（类全名），parameterMap是指参数键值对需要在当前ORM文件中自定义parameterMap，
 * 若是select标签则还可以写resultType和resultMap属性，resultType是指返回类型，resultMap也需要自定义resultMap标签
 * parameterMap和resultMap都是不常用的属性。
 * 建议使用parameterType和resultType属性.
 * 5）执行增删改，找到对应的标签之后，取出内部的sql语句（支持预编译，通过#{变量名称}来取值），
 * #{变量名称}语法规则：
 * 		parameterType的类型是8种基本数据类型或String类型，#{变量名称} 变量名称可以随意；
 * 		parameterType的类型是实体类类型#{变量名称}变量名称必须写实体类中的属性名称；
 * 		parameterType的类型是Map集合类型#{变量名称}变量名称必须写Map集合中的键名称.
 * 然后执行；
 * 	若执行的是selectList查询，则取出查询的结果集每一行封装成resultType属性值指定实体类的对象，放入List集合中返回；
 * 	若执行的是selectOne查询，则取出查询的结果集第一行封装成resultType属性值指定实体类的对象，并且返回
 * 6）Mybatis与Spring整合之后，可以利用MapperScannerConfigurer进行扫描包（可以不再写DAO层的实现类，一个接口
 * 是不能直接实例化的，这里spring就利用了动态代理技术自动生成一个代理对象）
 * 	a）ORM映射文件与对应接口类名称同名且放在同包下；
 * 	b）ORM映射文件的namespace属性值必须填入对应接口类全名字符串；
 * 	c）ORM映射文件中insert、delete、update、select标签的id属性值必须与对应接口中的方法名称保持一致；
 */
public interface UserMapper {
	
	/**
	 * 通过用户名加载一个用户对象 若用户名不存在则返回null
	 * @param userName
	 * @return
	 */
	User loadUserByUserName(String userName);

}
